import { mergeProps } from 'vue'
import { camelCase, merge, forOwn } from 'lodash-es'
import { DEFAULT_CONFIG } from './config'
import { eventCall, ObjectType } from './own-events'

// 合并 ag-grid 默认配置
export function mergeConfig(attrs: ObjectType): ObjectType {
  // 使用 merge 合并时，会丢失源数据的引用，导致 双向绑定的数据 响应式丢失
  // 仅 需要与默认配置 合并的 属性 使用 merge 处理
  const needMergeData: ObjectType = {}
  // 其他部分直接将 源数据 返回，避免 双向绑定的数据 响应式丢失
  const notNeedMergeData: ObjectType = {}

  // 将 对象 key 转换为 驼峰格式 - 避免 key 不一致 导致属性无法合并
  forOwn(attrs, (value, key) => {
    key = camelCase(key)

    if (DEFAULT_CONFIG.hasOwnProperty(key)) {
      needMergeData[key] = value
    } else {
      notNeedMergeData[key] = value
    }

    return key
  })

  return Object.assign(
    // 使用 merge 合并 默认属性，可合并深层属性，避免 默认属性 被覆盖
    merge(
      {},
      DEFAULT_CONFIG,
      needMergeData
    ),
    notNeedMergeData
  )
}

// 合并 事件
export function mergeEvent(attrs: ObjectType, ownEvents: ObjectType): ObjectType {
  // 使用 mergeProps 合并 事件，确保 组件内外绑定的 事件都可以触发
  const res = mergeProps(
    attrs,
    ownEvents
  )

  // 事件处理
  eventCall(res)

  return res
}